package cn.com.yto56.coresystem.msg.client;

import cn.com.yto56.coresystem.business.msg.soa.biz.IYtoMsgBiz;
import cn.com.yto56.coresystem.business.msg.soa.biz.IYtoMsgForJsonBiz;
import cn.com.yto56.coresystem.common.msg.util.base.StringUtils;
import cn.com.yto56.coresystem.common.msg.util.data.DataTypeChangeTool;
import cn.com.yto56.coresystem.common.msg.util.domain.AppResult;
import cn.com.yto56.coresystem.common.msg.util.http.HttpUtil;
import com.caucho.hessian.client.HessianProxyFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by wangrui on 2017/2/20.
 */
public class YtoMsgServiceClient {
    public static final String REQUEST_TYPE_HESSION = "RPC";
    public static final String REQUEST_TYPE_HTTP = "JSON";
    public static final String REQUEST_TYPE_DUBBO = "DUBBO";
    String url;
    String yto_msg_appId;
    IYtoMsgBiz ytoMsgService;
    IYtoMsgForJsonBiz ytoMsgForJsonBiz;
    String type;

    /**
     * 初始化客户端
     *
     * @param url  请求地址
     * @param type 请求类型
     * @throws MalformedURLException
     */
    public YtoMsgServiceClient(String url, String type) throws MalformedURLException {
        this.url = url;
        this.type = type;

        if (null == type || type.equals("") || (!type.equals(REQUEST_TYPE_HESSION) && !type.equals(REQUEST_TYPE_HTTP) && !type.equals(REQUEST_TYPE_DUBBO))) {
            type = REQUEST_TYPE_HTTP;
        }
        if (type.equals(REQUEST_TYPE_DUBBO)) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:" + url);
            ytoMsgService = (IYtoMsgBiz) context.getBean("ytoMsgService");
            context.start();
        } else if (type.equals(REQUEST_TYPE_HESSION)) {
            HessianProxyFactory factory = new HessianProxyFactory();
            factory.setReadTimeout(5000);
            factory.setHessian2Reply(false);
            ytoMsgService = (IYtoMsgBiz) factory.create(IYtoMsgBiz.class, url);
            ytoMsgForJsonBiz = (IYtoMsgForJsonBiz) factory.create(IYtoMsgForJsonBiz.class, url);
        } else {

        }
    }

    /**
     * 注册appId
     *
     * @param yto_msg_appId
     */
    public void bindAppId(String yto_msg_appId) {
        this.yto_msg_appId = yto_msg_appId;

    }

    /**
     * 获取 AppId
     *
     * @param yto_msg_systemName 系统名称
     * @param yto_msg_systemInfo 系统备注
     * @return
     */
    public AppResult getAppId(String yto_msg_systemName, String yto_msg_systemInfo) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_systemName", yto_msg_systemName);
        requstDatas.put("yto_msg_systemInfo", yto_msg_systemInfo);
        map.put("datas", requstDatas);
        return getAppResult("getAppId", map);
    }

    /**
     * 更加接口名获取字符串
     *
     * @param interfaceName
     * @param requestJson
     * @return
     */
    public String doInterface(String interfaceName, String requestJson) {
        return ytoMsgForJsonBiz.doInterface(interfaceName, requestJson);
    }

    /**
     * 注册用户
     *
     * @param yto_msg_sys_userId   外部系统userID
     * @param yto_msg_sys_userName 外部系统userName
     * @param yto_msg_sys_remark   外部系统备注
     * @return
     */
    public AppResult registerUser(String yto_msg_sys_userId, String yto_msg_sys_userName, String yto_msg_sys_remark) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_sys_userId", yto_msg_sys_userId);
        requstDatas.put("yto_msg_sys_userName", yto_msg_sys_userName);
        requstDatas.put("yto_msg_sys_remark", yto_msg_sys_remark);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("registerUser", map);
    }

    /**
     * 删除用户
     *
     * @param yto_msg_userId     消息中心userId
     * @param yto_msg_status     0 安全删除 1不安全删除  默认安全删除
     * @param yto_msg_sys_remark 备注
     * @return
     */
    public AppResult deleteUser(String yto_msg_userId, String yto_msg_status, String yto_msg_sys_remark) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_userId", yto_msg_userId);
        requstDatas.put("yto_msg_sys_remark", yto_msg_sys_remark);
        requstDatas.put("yto_msg_status", yto_msg_status);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("deleteUser", map);
    }

    /**
     * 检测用户
     *
     * @param yto_msg_userId
     * @return
     */
    public AppResult checkUser(String yto_msg_userId) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_userId", yto_msg_userId);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("checkUser", map);
    }

    /**
     * 添加组
     *
     * @param yto_msg_sys_userGroupId   外部系统userGroupId
     * @param yto_msg_sys_userGroupName 外部系统userGroupName
     * @param yto_msg_sys_remark        备注
     * @return
     */
    public AppResult addUserGroup(String yto_msg_sys_userGroupId, String yto_msg_sys_userGroupName, String yto_msg_sys_remark) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_sys_userGroupId", yto_msg_sys_userGroupId);
        requstDatas.put("yto_msg_sys_userGroupName", yto_msg_sys_userGroupName);
        requstDatas.put("yto_msg_sys_remark", yto_msg_sys_remark);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("addUserGroup", map);
    }

    /**
     * 删除组
     *
     * @param yto_msg_userGroupId 消息中心userGroupId系统
     * @param yto_msg_status      0 安全删除 1不安全删除  默认安全删除
     * @param yto_msg_sys_remark  备注
     * @return
     */
    public AppResult deleteUserGroup(String yto_msg_userGroupId, String yto_msg_status, String yto_msg_sys_remark) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_userGroupId", yto_msg_userGroupId);
        requstDatas.put("yto_msg_status", yto_msg_status);
        requstDatas.put("yto_msg_sys_remark", yto_msg_sys_remark);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("deleteUserGroup", map);
    }

    /**
     * 修改用户组
     *
     * @param yto_msg_userGroupId 消息中心 userGroupId
     * @param yto_msg_userId      消息中心userId
     * @param yto_msg_optype      0加入组 1移除组
     * @return
     */
    public AppResult modifyUserToGroup(String yto_msg_userGroupId, String yto_msg_userId, String yto_msg_optype) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_userGroupId", yto_msg_userGroupId);
        requstDatas.put("yto_msg_userId", yto_msg_userId);
        requstDatas.put("yto_msg_optype", yto_msg_optype);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("modifyUserToGroup", map);
    }

    /**
     * 添加消息模板
     *
     * @param yto_msg_templetInfo 模板信息
     * @param yto_msg_sys_remark  备注
     * @return
     */
    public AppResult addMSGTemplet(String yto_msg_templetInfo, String yto_msg_sys_remark) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_templetInfo", yto_msg_templetInfo);
        requstDatas.put("yto_msg_sys_remark", yto_msg_sys_remark);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("addMSGTemplet", map);
    }

    /**
     * 修改消息模板
     *
     * @param yto_msg_msgTempletId 消息中心模板id
     * @param yto_msg_templetInfo  模板信息
     * @param yto_msg_optype       0 修改  1删除
     * @param yto_msg_sys_remark
     * @return
     */
    public AppResult modifyMSGTemplet(String yto_msg_msgTempletId, String yto_msg_templetInfo, String yto_msg_optype, String yto_msg_sys_remark) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_msgTempletId", yto_msg_msgTempletId);
        requstDatas.put("yto_msg_templetInfo", yto_msg_templetInfo);
        requstDatas.put("yto_msg_optype", yto_msg_optype);
        requstDatas.put("yto_msg_sys_remark", yto_msg_sys_remark);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("modifyMSGTemplet", map);
    }

    /**
     * 发送消息
     *
     * @param yto_msg_receiverId      接收者id  可以是 userId 或 groupId
     * @param yto_msg_receiverType    接收者类型 0 userId  1 groupId
     * @param yto_msg_msgTempletId    消息中心模板id
     * @param yto_msg_msgTempletParam 模板参数
     * @param yto_msg_sendTime        发送时间 默认实时推送
     * @return
     */
    public AppResult sendMSGByTemplet(String yto_msg_receiverId, String yto_msg_receiverType, String yto_msg_msgTempletId, Map<String, String> yto_msg_msgTempletParam, String yto_msg_sendTime) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_receiverId", yto_msg_receiverId);
        requstDatas.put("yto_msg_receiverType", yto_msg_receiverType);
        requstDatas.put("yto_msg_msgTempletId", yto_msg_msgTempletId);
        requstDatas.put("yto_msg_msgTempletParam", yto_msg_msgTempletParam);
        requstDatas.put("yto_msg_sendTime", yto_msg_sendTime);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("sendMSGByTemplet", map);
    }

    /**
     * 获取当天消息
     *
     * @param yto_msg_userId
     * @param yto_msg_fixed_sendTime
     * @return
     */
    public AppResult getCurrentMSG(String yto_msg_userId, String yto_msg_fixed_sendTime) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_userId", yto_msg_userId);
        requstDatas.put("yto_msg_fixed_sendTime", yto_msg_fixed_sendTime);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("getCurrentMSG", map);
    }

    /**
     * 客户端接收成功调用
     *
     * @param msgLists 消息列表
     * @return
     */
    public AppResult updateMsgListState(List<Map> msgLists) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_msgList", msgLists);
        map.put("datas", requstDatas);
        map.put("yto_msg_appId", yto_msg_appId);
        return getAppResult("updateMsgListState", map);
    }

    /**
     * 获取补发的消息
     *
     * @param yto_msg_userId
     * @param yto_msg_fixed_sendTime
     * @param yto_msg_sendTime
     * @return
     */
    public AppResult getReSendMSG(String yto_msg_userId, String yto_msg_fixed_sendTime, String yto_msg_sendTime) {
        Map map = new HashMap();
        Map requstDatas = new HashMap();
        requstDatas.put("yto_msg_userId", yto_msg_userId);
        requstDatas.put("yto_msg_sendTime", yto_msg_sendTime);
        requstDatas.put("yto_msg_fixed_sendTime", yto_msg_fixed_sendTime);
        map.put("yto_msg_appId", yto_msg_appId);
        map.put("datas", requstDatas);
        return getAppResult("getReSendMSG", map);
    }

    public AppResult getAppResult(String interfaceName, Map map) {
        AppResult result = new AppResult();
        if (type.equals(REQUEST_TYPE_HESSION) || type.equals(REQUEST_TYPE_DUBBO)) {
            try {
                Class c = ytoMsgService.getClass();
                Method method = c.getMethod(interfaceName, new Class[]{Map.class});
                //获得参数Object
                Object[] arguments = new Object[]{map};
                //执行方法
                result = (AppResult) method.invoke(ytoMsgService, arguments);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } else {
            String json = HttpUtil.httpClient(DataTypeChangeTool.beanToJSON(map), url + "/" + interfaceName);
            if(StringUtils.isNotEmpty(json)){
                result = (AppResult) DataTypeChangeTool.jsonToBean(result, json);
            }
        }
        return result;
    }


}
